import { d3, initChart } from './c3-helper'

describe('c3 api grid', function() {
  'use strict'

  var chart, args

  beforeEach(function(done) {
    chart = initChart(chart, args, done)
  })

  describe('ygrid.add and ygrid.remove', function() {
    beforeAll(function() {
      args = {
        data: {
          columns: [['data1', 30, 200, 100, 400, 150, 250]]
        }
      }
    })

    it('updates y grids', function(done) {
      var main = chart.internal.main,
        expectedGrids = [
          {
            value: 100,
            text: 'Pressure Low'
          },
          {
            value: 200,
            text: 'Pressure High'
          }
        ],
        grids

      // Call ygrids.add
      chart.ygrids.add(expectedGrids)
      setTimeout(function() {
        grids = main.selectAll('.c3-ygrid-line')
        expect(grids.size()).toBe(expectedGrids.length)
        grids.each(function(d, i) {
          var y = +d3
              .select(this)
              .select('line')
              .attr('y1'),
            text = d3
              .select(this)
              .select('text')
              .text(),
            expectedY = Math.round(chart.internal.y(expectedGrids[i].value)),
            expectedText = expectedGrids[i].text
          expect(y).toBe(expectedY)
          expect(text).toBe(expectedText)
        })

        // Call ygrids.remove
        chart.ygrids.remove(expectedGrids)
        setTimeout(function() {
          grids = main.selectAll('.c3-ygrid-line')
          expect(grids.size()).toBe(0)
        }, 500)
      }, 500)

      setTimeout(function() {
        done()
      }, 1200)
    })

    it('updates x ygrids even if zoomed', function(done) {
      var main = chart.internal.main,
        expectedGrids = [
          {
            value: 0,
            text: 'Pressure Low'
          },
          {
            value: 1,
            text: 'Pressure High'
          }
        ],
        grids,
        domain

      chart.zoom([0, 2])
      setTimeout(function() {
        // Call xgrids
        chart.xgrids(expectedGrids)
        setTimeout(function() {
          grids = main.selectAll('.c3-xgrid-line')
          expect(grids.size()).toBe(expectedGrids.length)
          grids.each(function(d, i) {
            var x = +d3
                .select(this)
                .select('line')
                .attr('x1'),
              text = d3
                .select(this)
                .select('text')
                .text(),
              expectedX = Math.round(chart.internal.x(expectedGrids[i].value)),
              expectedText = expectedGrids[i].text
            expect(x).toBe(expectedX)
            expect(text).toBe(expectedText)
          })

          // check if it was not rescaled
          domain = chart.internal.y.domain()
          expect(domain[0]).toBeLessThan(0)
          expect(domain[1]).toBeGreaterThan(400)

          // Call xgrids.remove
          chart.xgrids.remove(expectedGrids)
          setTimeout(function() {
            grids = main.selectAll('.c3-xgrid-line')
            expect(grids.size()).toBe(0)
          }, 500) // for xgrids.remove()
        }, 500) // for xgrids()
      }, 500) // for zoom

      setTimeout(function() {
        done()
      }, 1700)
    })
  })
})
